package com.example;

import cn.hutool.core.io.FileTypeUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.resource.ClassPathResource;
import cn.hutool.core.io.resource.Resource;
import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.*;
import java.util.Properties;

// IO工具类的存在主要针对InputStream、OutputStream、Reader、Writer封装简化，并对NIO相关操作做封装简化。
@Slf4j
@SpringBootTest
public class IoUtilTest {

    @Test
    public void test() throws IOException {
        // FileUtil 是 Hutool 的一个工具类，用于文件操作，封装了文件读取、写入、复制、移动、删除等操作。

        // 创建文件，如果父目录不存在也自动创建
        File file = FileUtil.touch("d:/test.txt");
        // 创建目录，会递归创建每层目录
        File mkdir = FileUtil.mkdir("d:/test");
        // 获取文件列表，包括子目录
        File[] files = FileUtil.ls("d:/test");
        // 删除文件或目录（递归删除，不判断是否为空），这个方法相当于Linux的delete命令
        boolean del = FileUtil.del("d:/test");

        // 获取文件输入流，用于读取文件内容
        BufferedInputStream in = FileUtil.getInputStream("d:/test.txt");
        // 获取文件输出流，用于写入文件内容
        BufferedOutputStream out = FileUtil.getOutputStream("d:/test2.txt");
        // 将输入流中的内容复制到输出流中，拷贝文件。并使用默认的缓冲区大小1024字节。
        long copySize = IoUtil.copy(in, out, IoUtil.DEFAULT_BUFFER_SIZE);


        // 将字节输入流转换为字符输入流
        BufferedReader reader = IoUtil.getReader(in, CharsetUtil.CHARSET_UTF_8);
        // 将字节输出流转换为字符输出流
        OutputStreamWriter writer = IoUtil.getWriter(out, CharsetUtil.CHARSET_UTF_8);


    }

    // 读取项目src/main/resources下的配置文件
    @Test
    public void test2() throws IOException {
        ClassPathResource resource = new ClassPathResource("application.yaml");
        Properties properties = new Properties();
        properties.load(resource.getStream());
        log.info("Properties: {}", properties);


        // ResourceUtil 默认调用ClassPathResource读取classpath中的资源或者文件。保持原有文件内容格式
        // 读取项目 src/main/resources 下的配置文件 application.yaml
        String str = ResourceUtil.readUtf8Str("application.yaml");
        // 读取项目 src/main/resources/config 下的配置文件 application.yaml
        String str1 = ResourceUtil.readUtf8Str("static/index.html");
        log.info("str: {}, str1: {}", str, str1);

        // 读取项目 src/main/resources 下的配置文件 application.yaml
        Resource resourceObj = ResourceUtil.getResourceObj("application.yaml");
        // 打印 file:/home/lcqh/Java/springboot-demo/hutool-demo/target/classes/application.yaml 绝对路径
        System.out.println(resourceObj.getUrl());
        // 打印 classpath:application.yaml
        log.info("resourceObj: {}", resourceObj);
    }


    @Test
    public void test3() throws IOException {
        // 读取文件
        File file = FileUtil.file("~/图片/line.png");
        // 获取文件类型
        String type = FileTypeUtil.getType(file);
        // 输出 jpg则说明确实为jpg文件
        log.info("type: {}", type);
    }
}
